#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/6/22 1:49
# @Author  : summer
# @Email   : 610658552@qq.com
# @File    : exception_handler.py.py
# @Software: PyCharm
# @Desc    :

# oa/utils/exception_handler.py
from rest_framework.views import exception_handler
from rest_framework.exceptions import ValidationError, APIException
from common.utils.rsp import error_response
from django.db import DatabaseError
import traceback


def custom_exception_handler(exc, context):
    """
    自定义异常处理，将所有异常转换为统一的响应格式
    响应格式：
    {
        "success": False,
        "code": 400/401/403/404/500,
        "message": "错误信息",
        "data": 错误详情（如字段验证错误）
    }
    """
    # 首先调用DRF默认的异常处理，获取标准的DRF响应
    response = exception_handler(exc, context)

    # 处理DRF验证错误（如序列化器验证失败）
    if isinstance(exc, ValidationError):
        return error_response(
            data=exc.detail,
            message="参数验证失败",
            code=400
        )

    # 处理DRF权限错误
    if isinstance(exc, APIException):
        return error_response(
            data={"detail": exc.detail},
            message=str(exc),
            code=exc.status_code
        )

    # 处理数据库错误
    if isinstance(exc, DatabaseError):
        # 记录详细的数据库错误日志
        print(f"数据库错误: {str(exc)}")
        traceback.print_exc()
        return error_response(
            data=None,
            message="数据库操作失败，请稍后重试",
            code=500
        )

    # 处理其他未被DRF捕获的异常（如视图中的自定义异常）
    if response is not None:
        return error_response(
            data=response.data,
            message=response.data.get("detail", "操作失败"),
            code=response.status_code
        )

    # 处理未预期的异常（如代码错误）
    print(f"未预期异常: {str(exc)}")
    traceback.print_exc()
    return error_response(
        data=None,
        message="服务器内部错误，请稍后重试",
        code=500
    )

# from rest_framework.views import exception_handler
# from rest_framework.exceptions import ValidationError
# from oa.utils.rsp import error_response
# from rest_framework import status
#
#
# def custom_exception_handler(exc, context):
#     # 首先调用DRF默认的异常处理
#     response = exception_handler(exc, context)
#
#     # 处理ValidationError（序列化器验证失败）
#     if isinstance(exc, ValidationError):
#         return error_response(
#             data=exc.detail,  # 错误详情（字段级错误）
#             message="参数验证失败",
#             code=400
#         )
#
#     # 处理其他异常...
#     if response is not None:
#         # 统一错误响应格式
#         response.data = {
#             "success": False,
#             "code": response.status_code,
#             "message": response.data.get("detail", "服务器错误"),
#             "data": response.data
#         }
#
#     return response
